package cn.tedu.rms.base.util;

import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;

@Slf4j
@Component
public class SpringContextUtils implements ApplicationContextAware {

    //ApplicationContextAware接口允许Bean获取对ApplicationContext（应用程序上下文）的引用。
    //该接口仅包含一个方法：void setApplicationContext(ApplicationContext applicationContext) throws BeansException;。
    // 当一个类实现了这个接口后，Spring容器会在创建该Bean之后，自动调用这个Bean的setApplicationContext方法，并将容器本身（即ApplicationContext对象）作为参数传递给该方法。

    //通过实现ApplicationContextAware接口，Bean可以方便地获取到ApplicationContext对象，
    //从而可以进一步获取容器中的其他Bean、资源以及容器提供的其他功能。
    private static ApplicationContext applicationContext;
    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        SpringContextUtils.applicationContext = applicationContext;
    }

    /**
     * 按照类型 从spring容器中获取bean
     * @param clazz
     * @return
     * @param <T>
     */
    public static <T> T getBean(Class<T> clazz){
        return applicationContext.getBean(clazz);
    }
    public static <T> T getBean(String name,Class<T> clazz){
        return applicationContext.getBean(name,clazz);
    }
}
